package 集合;
/*
如果我们自己编写了一个集合类，想要使用for each循环，只需满足以下条件：
	1. 集合类实现Iterable接口，该接口要求返回一个Iterator对象；
	2. 用Iterator对象迭代集合内部数据。
理解：
	1. 集合类实现Iterable接口；-->覆写Iterator()方法
	2. Iterator()方法返回一个自己定义的ReverseIterator类的实例，该类为集合类的内部类；
	3. ReverseIterator类分别覆写：Iterator的hasNext()即next()方法。
*/
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
//建立一个倒序遍历集合
public class 使用Iterator {
	public static void main(String[] args) {
		List<Integer> llist=new LinkedList<>();
      llist.add(1);
      llist.add(2);
      llist.add(3);
      System.out.println(llist.get(2));
      
      ReverseList<String> rlist = new ReverseList<>();
      rlist.add("Apple");
      rlist.add("Orange");
      rlist.add("Pear");
      for (String s : rlist) {
          System.out.println(s);
      }
  }
}
class ReverseList<T> implements Iterable<T>{
	private List<T> list = new ArrayList<>();
	public void add(T t) {
		list.add(t);
	}
	
	@Override
	public Iterator<T> iterator(){
		return new ReverseIterator(list.size());//Iterator<T> iterator=new ReverseIterator(list.size());
	}
	class ReverseIterator implements Iterator<T>{//内部类
		int index;
		ReverseIterator(int index){
			this.index=index;
		}
		@Override
		public boolean hasNext() {
			return index>0;
		}
		
		@Override
		public T next() {
			int returnIndex=ReverseList.this.list.size()-index;//正序
			index--;
			return ReverseList.this.list.get(returnIndex);//正序  内部类访问外部类Outer.this.list
			//return ReverseList.this.list.get(index);//倒序
			
		}
	}
}

/*
虽然ReverseList和ReverseIterator的实现类稍微比较复杂，但是，注意到这是底层集合库，只需编写一次。而调用方则完全按for each循
环编写代码，根本不需要知道集合内部的存储逻辑和遍历逻辑。

在编写Iterator的时候，我们通常可以用一个内部类来实现Iterator接口，这个内部类可以直接访问对应的外部类的所有字段和方法。例如，上述代
码中，内部类ReverseIterator可以用ReverseList.this获得当前外部类的this引用，然后，通过这个this引用就可以访
问ReverseList的所有字段和方法。
*/